package com.rem.concurrency.juc.my9Pool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 手动创建线程池
 * <p>
 * <p>
 * <p>
 * 四种拒绝策略
 * new ThreadPoolExecutor.AbortPolicy() // 银行满了，还有人进来，不处理这个人的，抛出异常
 * new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里！
 * new ThreadPoolExecutor.DiscardPolicy() //队列满了，丢掉任务，不会抛出异常！
 * new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了，尝试去和最早的竞争，也不会抛出异常！
 * <p>
 * <p>
 * <p>
 * 可承载的最大线程数=最大线程数+阻塞队列大小
 * 超过最大线程数就走拒绝策略
 * <p>
 * <p>
 * 线程池大小如何设置
 * CPU密集型：尽量使用较小的线程池，一般Cpu核心数+1
 * IO密集型：（线程等待时间与线程CPU时间之比 + 1）* CPU数目
 *
 * @author Rem
 * @date 2021-03-10
 */


public class Demo02 {

    public static void main(String[] args) {

        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
                //核心线程数
                2,
                //最大线程数
                5,
                //等待时长
                6,
                //等待单位
                TimeUnit.SECONDS,
                //阻塞队列
                new ArrayBlockingQueue<>(3),
                //线程工厂
                Executors.defaultThreadFactory(),
                //拒绝策略
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );

        try {
            for (int i = 0; i < 9; i++) {
                poolExecutor.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "--->办业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            poolExecutor.shutdown();
        }

    }
}
